home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / doom / quake2.zip / QJOE19.ZIP / DOG.QC < prev    next >
Text File  |  1996-08-14  |  12KB  |  363 lines

  1. /*
  2. ==============================================================================
  3.  
  4. DOG
  5.  
  6. ==============================================================================
  7. */
  8. $cd /raid/quake/id1/models/dog
  9. $origin 0 0 24
  10. $base base
  11. $skin skin
  12.  
  13. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  14.  
  15. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  16.  
  17. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  18. $frame deathb9
  19.  
  20. $frame pain1 pain2 pain3 pain4 pain5 pain6
  21.  
  22. $frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10
  23. $frame painb11 painb12 painb13 painb14 painb15 painb16
  24.  
  25. $frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12
  26.  
  27. $frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9
  28.  
  29. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  30.  
  31. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  32.  
  33.  
  34. void() dog_leap1;
  35. void() dog_run1;
  36.  
  37. /*
  38. ================
  39. dog_bite
  40.  
  41. ================
  42. */
  43. void() dog_bite =
  44. {
  45. local vector    delta;
  46. local float     ldmg;
  47.  
  48.     if (!self.enemy)
  49.         return;
  50.     
  51.     ai_charge(10);
  52.  
  53.     if (!CanDamage (self.enemy, self))
  54.         return;
  55.  
  56.     delta = self.enemy.origin - self.origin;
  57.  
  58.     if (vlen(delta) > 100)
  59.         return;
  60.         
  61.     //ldmg = (random() + random() + random()) * 8;
  62.  
  63.     T_Damage (self.enemy, self, self, 10);
  64. };
  65.  
  66. void()  Dog_JumpTouch =
  67. {
  68.  
  69.     local   float   ldmg;
  70.     
  71.     if (self.health <= 0)
  72.         return;
  73.         
  74.     if (other.takedamage)
  75.     {
  76.         if ( vlen(self.velocity) > 300 )
  77.         {
  78.             ldmg = 10 + 10*random();
  79.             T_Damage (other, self, self, ldmg);
  80.             
  81.         }
  82.     }
  83.  
  84.     if (!checkbottom(self))
  85.     {
  86.         if (self.flags & FL_ONGROUND)
  87.         {       // jump randomly to not get hung up
  88. //dprint ("popjump\n");
  89.     self.touch = SUB_Null;
  90.     self.think = dog_leap1;
  91.     self.nextthink = time + 0.1;
  92.  
  93. //                      self.velocity_x = (random() - 0.5) * 600;
  94. //                      self.velocity_y = (random() - 0.5) * 600;
  95. //                      self.velocity_z = 200;
  96. //                      self.flags = self.flags - FL_ONGROUND;
  97.         }
  98.         return; // not on ground yet
  99.     }
  100.  
  101.     self.touch = SUB_Null;
  102.     self.think = dog_run1;
  103.     self.nextthink = time + 0.1;
  104. };
  105.  
  106.  
  107. void() dog_stand1       =[      $stand1,        dog_stand2      ] {ai_stand();};
  108. void() dog_stand2       =[      $stand2,        dog_stand3      ] {ai_stand();};
  109. void() dog_stand3       =[      $stand3,        dog_stand4      ] {ai_stand();};
  110. void() dog_stand4       =[      $stand4,        dog_stand5      ] {ai_stand();};
  111. void() dog_stand5       =[      $stand5,        dog_stand6      ] {ai_stand();};
  112. void() dog_stand6       =[      $stand6,        dog_stand7      ] {ai_stand();};
  113. void() dog_stand7       =[      $stand7,        dog_stand8      ] {ai_stand();};
  114. void() dog_stand8       =[      $stand8,        dog_stand9      ] {ai_stand();};
  115. void() dog_stand9       =[      $stand9,        dog_stand1      ] {ai_stand();};
  116.  
  117. void() dog_walk1        =[      $walk1 ,        dog_walk2       ] {
  118. if (random() < 0.2)
  119.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  120. ai_walk(8);};
  121. void() dog_walk2        =[      $walk2 ,        dog_walk3       ] {ai_walk(8);};
  122. void() dog_walk3        =[      $walk3 ,        dog_walk4       ] {ai_walk(8);};
  123. void() dog_walk4        =[      $walk4 ,        dog_walk5       ] {ai_walk(8);};
  124. void() dog_walk5        =[      $walk5 ,        dog_walk6       ] {ai_walk(8);};
  125. void() dog_walk6        =[      $walk6 ,        dog_walk7       ] {ai_walk(8);};
  126. void() dog_walk7        =[      $walk7 ,        dog_walk8       ] {ai_walk(8);};
  127. void() dog_walk8        =[      $walk8 ,        dog_walk1       ] {ai_walk(8);};
  128.  
  129. void() dog_run1         =[      $run1  ,        dog_run2        ] {
  130. if (random() < 0.2)
  131.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  132. ai_run(16);};
  133. void() dog_run2         =[      $run2  ,        dog_run3        ] {ai_run(32);};
  134. void() dog_run3         =[      $run3  ,        dog_run4        ] {ai_run(32);};
  135. void() dog_run4         =[      $run4  ,        dog_run5        ] {ai_run(20);};
  136. void() dog_run5         =[      $run5  ,        dog_run6        ] {ai_run(64);};
  137. void() dog_run6         =[      $run6  ,        dog_run7        ] {ai_run(32);};
  138. void() dog_run7         =[      $run7  ,        dog_run8        ] {ai_run(16);};
  139. void() dog_run8         =[      $run8  ,        dog_run9        ] {ai_run(32);};
  140. void() dog_run9         =[      $run9  ,        dog_run10       ] {ai_run(32);};
  141. void() dog_run10        =[      $run10  ,       dog_run11       ] {ai_run(20);};
  142. void() dog_run11        =[      $run11  ,       dog_run12       ] {ai_run(64);};
  143. void() dog_run12        =[      $run12  ,       dog_run1        ] {ai_run(32);};
  144.  
  145. void() dog_atta1        =[      $attack1,       dog_atta2       ] {ai_charge(10);};
  146. void() dog_atta2        =[      $attack2,       dog_atta3       ] {ai_charge(10);};
  147. void() dog_atta3        =[      $attack3,       dog_atta4       ] {ai_charge(10);};
  148. void() dog_atta4        =[      $attack4,       dog_atta5       ] {
  149. sound (self, CHAN_VOICE, "dog/dattack1.wav", 1, ATTN_NORM);
  150. dog_bite();};
  151. void() dog_atta5        =[      $attack5,       dog_atta6       ] {ai_charge(10);};
  152. void() dog_atta6        =[      $attack6,       dog_atta7       ] {ai_charge(10);};
  153. void() dog_atta7        =[      $attack7,       dog_atta8       ] {ai_charge(10);};
  154. void() dog_atta8        =[      $attack8,       dog_run1        ] {ai_charge(10);};
  155.  
  156. void() dog_leap1        =[      $leap1,         dog_leap2       ] {ai_face();};
  157. void() dog_leap2        =[      $leap2,         dog_leap3       ]
  158. {
  159.     ai_face();
  160.     
  161.     self.touch = Dog_JumpTouch;
  162.     makevectors (self.angles);
  163.     self.origin_z = self.origin_z + 1;
  164.     self.velocity = v_forward * 300 + '0 0 200';
  165.     if (self.flags & FL_ONGROUND)
  166.         self.flags = self.flags - FL_ONGROUND;
  167. };
  168.  
  169. void() dog_leap3        =[      $leap3,         dog_leap4       ] {};
  170. void() dog_leap4        =[      $leap4,         dog_leap5       ] {};
  171. void() dog_leap5        =[      $leap5,         dog_leap6       ] {};
  172. void() dog_leap6        =[      $leap6,         dog_leap7       ] {};
  173. void() dog_leap7        =[      $leap7,         dog_leap8       ] {};
  174. void() dog_leap8        =[      $leap8,         dog_leap9       ] {};
  175. void() dog_leap9        =[      $leap9,         dog_leap9       ] {};
  176.  
  177. void() dog_pain1        =[      $pain1 ,        dog_pain2       ] {};
  178. void() dog_pain2        =[      $pain2 ,        dog_pain3       ] {};
  179. void() dog_pain3        =[      $pain3 ,        dog_pain4       ] {};
  180. void() dog_pain4        =[      $pain4 ,        dog_pain5       ] {};
  181. void() dog_pain5        =[      $pain5 ,        dog_pain6       ] {};
  182. void() dog_pain6        =[      $pain6 ,        dog_run1        ] {};
  183.  
  184. void() dog_painb1       =[      $painb1 ,       dog_painb2      ] {};
  185. void() dog_painb2       =[      $painb2 ,       dog_painb3      ] {};
  186. void() dog_painb3       =[      $painb3 ,       dog_painb4      ] {ai_pain(4);};
  187. void() dog_painb4       =[      $painb4 ,       dog_painb5      ] {ai_pain(12);};
  188. void() dog_painb5       =[      $painb5 ,       dog_painb6      ] {ai_pain(12);};
  189. void() dog_painb6       =[      $painb6 ,       dog_painb7      ] {ai_pain(2);};
  190. void() dog_painb7       =[      $painb7 ,       dog_painb8      ] {};
  191. void() dog_painb8       =[      $painb8 ,       dog_painb9      ] {ai_pain(4);};
  192. void() dog_painb9       =[      $painb9 ,       dog_painb10     ] {};
  193. void() dog_painb10      =[      $painb10 ,      dog_painb11     ] {ai_pain(10);};
  194. void() dog_painb11      =[      $painb11 ,      dog_painb12     ] {};
  195. void() dog_painb12      =[      $painb12 ,      dog_painb13     ] {};
  196. void() dog_painb13      =[      $painb13 ,      dog_painb14     ] {};
  197. void() dog_painb14      =[      $painb14 ,      dog_painb15     ] {};
  198. void() dog_painb15      =[      $painb15 ,      dog_painb16     ] {};
  199. void() dog_painb16      =[      $painb16 ,      dog_run1        ] {};
  200.  
  201. void() dog_pain =
  202. {
  203.     sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM);
  204.  
  205.     if (random() > 0.5)
  206.         dog_pain1 ();
  207.     else
  208.         dog_painb1 ();
  209. };
  210.  
  211. void() dog_die1         =[      $death1,        dog_die2        ] {};
  212. void() dog_die2         =[      $death2,        dog_die3        ] {};
  213. void() dog_die3         =[      $death3,        dog_die4        ] {};
  214. void() dog_die4         =[      $death4,        dog_die5        ] {};
  215. void() dog_die5         =[      $death5,        dog_die6        ] {};
  216. void() dog_die6         =[      $death6,        dog_die7        ] {};
  217. void() dog_die7         =[      $death7,        dog_die8        ] {};
  218. void() dog_die8         =[      $death8,        dog_die9        ] {};
  219. void() dog_die9         =[      $death9,        dog_die9        ] {};
  220.  
  221. void() dog_dieb1                =[      $deathb1,       dog_dieb2       ] {};
  222. void() dog_dieb2                =[      $deathb2,       dog_dieb3       ] {};
  223. void() dog_dieb3                =[      $deathb3,       dog_dieb4       ] {};
  224. void() dog_dieb4                =[      $deathb4,       dog_dieb5       ] {};
  225. void() dog_dieb5                =[      $deathb5,       dog_dieb6       ] {};
  226. void() dog_dieb6                =[      $deathb6,       dog_dieb7       ] {};
  227. void() dog_dieb7                =[      $deathb7,       dog_dieb8       ] {};
  228. void() dog_dieb8                =[      $deathb8,       dog_dieb9       ] {};
  229. void() dog_dieb9                =[      $deathb9,       dog_dieb9       ] {};
  230.  
  231.  
  232. void() dog_die =
  233. {
  234. // check for gib
  235.     if (self.health < -35)
  236.     {
  237.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  238.         ThrowGib ("progs/gib3.mdl", self.health);
  239.         ThrowGib ("progs/gib3.mdl", self.health);
  240.         ThrowGib ("progs/gib3.mdl", self.health);
  241.         ThrowHead ("progs/h_dog.mdl", self.health);
  242.         return;
  243.     }
  244.  
  245. // regular death
  246.     sound (self, CHAN_VOICE, "dog/ddeath.wav", 1, ATTN_NORM);
  247.     self.solid = SOLID_NOT;
  248.     dog_dieb1 ();
  249. };
  250.  
  251. //============================================================================
  252.  
  253. /*
  254. ==============
  255. CheckDogMelee
  256.  
  257. Returns TRUE if a melee attack would hit right now
  258. ==============
  259. */
  260. float() CheckDogMelee =
  261. {
  262.     if (enemy_range == RANGE_MELEE)
  263.     {       // FIXME: check canreach
  264.         self.attack_state = AS_MELEE;
  265.         return TRUE;
  266.     }
  267.     return FALSE;
  268. };
  269.  
  270. /*
  271. ==============
  272. CheckDogJump
  273.  
  274. ==============
  275. */
  276. float() CheckDogJump =
  277. {
  278.     local   vector  dist;
  279.     local   float   d;
  280.  
  281.     if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z
  282.     + 0.75 * self.enemy.size_z)
  283.         return FALSE;
  284.         
  285.     if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z
  286.     + 0.25 * self.enemy.size_z)
  287.         return FALSE;
  288.         
  289.     dist = self.enemy.origin - self.origin;
  290.     dist_z = 0;
  291.     
  292.     d = vlen(dist);
  293.     
  294.     if (d < 80)
  295.         return FALSE;
  296.         
  297.     if (d > 150)
  298.         return FALSE;
  299.         
  300.     return TRUE;
  301. };
  302.  
  303. float() DogCheckAttack =
  304. {
  305.     local   vector  vec;
  306.     
  307. // if close enough for slashing, go for it
  308.     if (CheckDogMelee ())
  309.     {
  310.         self.attack_state = AS_MELEE;
  311.         return TRUE;
  312.     }
  313.     
  314.     if (CheckDogJump ())
  315.     {
  316.         self.attack_state = AS_MISSILE;
  317.         return TRUE;
  318.     }
  319.     
  320.     return FALSE;
  321. };
  322.  
  323.  
  324. //===========================================================================
  325.  
  326. /*QUAKED monster_dog (1 0 0) (-32 -32 -24) (32 32 40) Ambush
  327.  
  328. */
  329. void() monster_dog =
  330. {
  331.     if (deathmatch)
  332.     {
  333.         remove(self);
  334.         return;
  335.     }
  336.     precache_model ("progs/h_dog.mdl");
  337.     precache_model ("progs/dog.mdl");
  338.  
  339.     precache_sound ("dog/dattack1.wav");
  340.     precache_sound ("dog/ddeath.wav");
  341.     precache_sound ("dog/dpain1.wav");
  342.     precache_sound ("dog/dsight.wav");
  343.     precache_sound ("dog/idle.wav");
  344.  
  345.     self.solid = SOLID_SLIDEBOX;
  346.     self.movetype = MOVETYPE_STEP;
  347.  
  348.     setmodel (self, "progs/dog.mdl");
  349.  
  350.     setsize (self, '-32 -32 -24', '32 32 40');
  351.     self.health = 25;
  352.  
  353.     self.th_stand = dog_stand1;
  354.     self.th_walk = dog_walk1;
  355.     self.th_run = dog_run1;
  356.     self.th_pain = dog_pain;
  357.     self.th_die = dog_die;
  358.     self.th_melee = dog_atta1;
  359.     self.th_missile = dog_leap1;
  360.  
  361.     walkmonster_start();
  362. };
  363.